// 给你一个整数数组 nums 和一个整数 x 。每一次操作时，你应当移除数组 nums 最左边或最右边的元素，然后从 x 中减去该元素的值。
// 请注意，需要 修改 数组以供接下来的操作使用。如果可以将 x 恰好 减到 0 ，返回 最小操作数 ；否则，返回 -1 。

// 输入：nums = [1,1,4,2,3], x = 5
// 输出：2
// 解释：最佳解决方案是移除后两个元素，将 x 减到 0 。


// 问题转换: 求中间和为sum - x的最长片段 ---》使用滑动窗口
int minOperations(int* nums, int numsSize, int x){
    int i, target = -x;
    for (i = 0; i < numsSize; i++)
        target += nums[i];
    // 目标和为sum - x

    int l = 0, r = 0;
    int cur_sum = 0, res = -1;

    while (r < numsSize) {
        cur_sum += nums[r++];   // 滑动右边
        while (cur_sum > target && l < numsSize) { // 大于目标值时滑动左边
            cur_sum -= nums[l++];
        }
        if (cur_sum == target) res = fmax(res, r - l);  // 滑动窗口为[l, r)// 滑动窗口为[l, r)
    }
    return res == -1? -1 : (numsSize - res);
}
